package cn.duhengkui.national.poi.word;

import java.io.IOException;    
import java.io.InputStream;    
import org.apache.poi.openxml4j.opc.OPCPackage;    
import org.apache.poi.xwpf.usermodel.XWPFDocument;    
import org.apache.poi.xwpf.usermodel.XWPFParagraph;    
import org.apache.xmlbeans.XmlException;    
import org.apache.xmlbeans.XmlToken;    
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;    
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;    
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;    
       
/** 
 * 自定义 XWPFDocument，并重写 createPicture()方法  
 */   
/**   
 * <table border="1">
 *	<tr><td>包名称：</td><td>cn.duhengkui.national.poi.word</td></tr>
 *	<tr><td>类名称：</td><td>CustomXWPFDocument</td></tr>
 *	<tr><td>类描述：</td><td>图片生成</td></tr>
 *	<tr><td>创建人：</td><td>杜恒奎</td></tr>
 *  <tr><td>创建时间：</td><td>2018年7月11日/下午2:46:12</td></tr> 
 *  <tr><td>版本：</td><td>1.0.0</td></tr>
 * </table>   
 *     
 */
public class CustomXWPFDocument extends XWPFDocument {      
    public CustomXWPFDocument(InputStream in) throws IOException {      
        super(in);     
    }     
       
    public CustomXWPFDocument() {      
        super();     
    }     
       
    public CustomXWPFDocument(OPCPackage pkg) throws IOException {      
        super(pkg);     
    }     
       
    /** 
     * @param id  
     * @param width 宽  
     * @param height 高  
     * @param paragraph  段落  
     */   
    public void createPicture(int id,String blipId, int width, int height,XWPFParagraph paragraph) {      
        final int EMU = 9525;     
        width *= EMU;      
        height *= EMU;      
        //String blipId = getAllPictures().get(id).getPackageRelationship().getId();      
        CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();      
        String picXml = new StringBuilder().append("<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">")   
        .append("   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"   ) 
        .append("      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" )    
        .append("         <pic:nvPicPr>" + "            <pic:cNvPr id=\""     )
        .append( id    )  
        .append("\" name=\"Generated\"/>"     )
        .append("            <pic:cNvPicPr/>"     )
        .append("         </pic:nvPicPr>"     )
        .append("         <pic:blipFill>"     )
        .append("            <a:blip r:embed=\""     )
        .append( blipId      )
        .append("\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"     )
        .append("            <a:stretch>"     )
        .append("               <a:fillRect/>"     )
        .append("            </a:stretch>"     )
        .append("         </pic:blipFill>"     )
        .append("         <pic:spPr>"     )
        .append("            <a:xfrm>"     )
        .append("               <a:off x=\"0\" y=\"0\"/>"    ) 
        .append("               <a:ext cx=\""     )
        .append(width      )
        .append("\" cy=\""     )
        .append( height      )
        .append("\"/>"     )
        .append("            </a:xfrm>"     )
        .append("            <a:prstGeom prst=\"rect\">")     
        .append("               <a:avLst/>"     )
        .append("            </a:prstGeom>"     )
        .append("         </pic:spPr>"     )
        .append("      </pic:pic>"     )
        .append("   </a:graphicData></a:graphic>").toString();     
       
        inline.addNewGraphic().addNewGraphicData();     
        XmlToken xmlToken = null;     
        try{      
            xmlToken = XmlToken.Factory.parse(picXml);      
        }catch(XmlException xe) {      
            xe.printStackTrace();     
        }     
        inline.set(xmlToken);    
             
        inline.setDistT(0);       
        inline.setDistB(0);       
        inline.setDistL(0);       
        inline.setDistR(0);       
             
        CTPositiveSize2D extent = inline.addNewExtent();      
        extent.setCx(width);     
        extent.setCy(height);     
             
        CTNonVisualDrawingProps docPr = inline.addNewDocPr();        
        docPr.setId(id);       
        docPr.setName("pic_"+ id);        
        docPr.setDescr("pic_" + id);    
    }     
}     